题目:判断一个带头结点的单链表L是否有环
解题思路:
咋看之下,这题还真不好解,于是又一些投机取巧的人,在访问单链表中元素的时候,用一个比较大的数N控制访问元素的个数,他们认为如果在访问到第N个元素之前有一个元素为null,那么单链表没有环,反之,单链表有环。他们的解释是都访问了这么多元素了,还没有一个元素为空,单链表很有可能有环,再加上一般单链表中的元素都不超过N个,所以单链表有环。对于这种解答方式,我们也只能呵呵了。
解题思路:
咋看之下,这题还真不好解,于是又一些投机取巧的人,在访问单链表中元素的时候,用一个比较大的数N控制访问元素的个数,他们认为如果在访问到第N个元素之前有一个元素为null,那么单链表没有环,反之,单链表有环。他们的解释是都访问了这么多元素了,还没有一个元素为空,单链表很有可能有环,再加上一般单链表中的元素都不超过N个,所以单链表有环。对于这种解答方式,我们也只能呵呵了。
要判断单链表有没有环,肯定会判断两个指针是否相等。而且这两个指针从头结点位置开始走的步数肯定不一样。可以设两个指针slow,fast,slow从头结点开始往后走,每次走一步,同时fast从头结点开始往后走,每次走两步,这两个指针一直往后面走直到fast为空,则单链表无环,或者slow与fast相等,则单链表有环。这个过程可以保证slow会走过所有在它之前的结点,同时fast比slow多走的步长从1开始每次递增1,而且当它们相遇时多走的步长就是环中结点的个数的正整数倍。